﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using Viettel.VOFFICE.DAO.DAL;

namespace Viettel.VOFFICE.Web.Helpers
{
    public static class UtilityHelper
    {
        /// <summary>
        /// Lấy ra phần mở rộng của file
        /// </summary>
        /// <param name="fileName">tên file hay đường dẫn</param>
        /// <returns>.ext</returns>
        public static string GetFileExtension(string fileName)
        {
            if (string.IsNullOrWhiteSpace(fileName)) return null;
            return Path.GetExtension(fileName);
        }
        /// <summary>
        /// check file exist
        /// </summary>
        /// <param name="virtualPath"></param>
        /// <returns></returns>
        public static bool FileExist(string virtualPath)
        {
            var fi = new FileInfo(HttpContext.Current.Server.MapPath(virtualPath));
            return fi.Exists;
        }

        /// <summary>
        /// Kiểm tra file upload có phải là doc hay docx hay không
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool IsDoc(string fileName)
        {
            if (string.IsNullOrWhiteSpace(fileName)) return false;
            var extension = Path.GetExtension(fileName);
            return extension != null && ((extension.ToLower() == ".doc" || extension.ToLower() == ".docx"));
        }

        /// <summary>
        /// Kiểm tra file upload có phải là doc hay docx hay không
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool IsPdf(string fileName)
        {
            if (string.IsNullOrWhiteSpace(fileName)) return false;
            var extension = Path.GetExtension(fileName);
            return extension != null && ((extension.ToLower() == ".pdf"));
        }

        /// <summary>
        /// Kiểm tra file upload có phải là doc hay docx hay không
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool IsImage(string fileName)
        {
            if (string.IsNullOrWhiteSpace(fileName)) return false;
            var extension = Path.GetExtension(fileName);
            return extension != null && ((
                extension.ToLower() == ".png"
                || extension.ToLower() == ".bmp"
                || extension.ToLower() == ".jpg"
                || extension.ToLower() == ".jpeg"
                || extension.ToLower() == ".gif"
                || extension.ToLower() == ".raw"
                || extension.ToLower() == ".svg"
            ));
        }

        /// <summary>
        /// detect localhost
        /// </summary>
        /// <returns></returns>
        public static bool IsLocalHost()
        {
            return HttpContext.Current.Request.Url.Host.ToString(CultureInfo.InvariantCulture).ToUpper().Contains("LOCALHOST");
        }

        /// <summary>
        /// Lấy thông tin profile của một username
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public static ProfileHelpers GetUserProfile(string userName)
        {
            var profile = ProfileHelpers.GetUserProfile(userName);
            return profile;
        }

        /// <summary>
        /// Lấy ra thông tin về id của người dùng hiện tại đang đăng nhập
        /// </summary>
        /// <returns></returns>
        public static Guid? GetUserId()
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                var curentUser = HttpContext.Current.User.Identity.Name;
                using (var unitOfWork = new UnitOfWork())
                {
                    var first = unitOfWork.UserRepository.FindByName(curentUser).FirstOrDefault();
                    if (first == null) return null;
                    return first.UserId;
                }
            }
            return null;
        }

        /// <summary>
        /// Lấy firstName
        /// </summary>
        /// <param name="fullName"></param>
        /// <returns></returns>
        public static string GetLastName(this string fullName)
        {
            var arrName = fullName.Trim().Split(new char[] { ' ' });
            return arrName.Length > 0 ? arrName[arrName.Length - 1].ToString() : fullName;
        }

        /// <summary>
        /// Lấy lastname
        /// </summary>
        /// <param name="fullName"></param>
        /// <returns></returns>
        public static string GetFirstName(this string fullName)
        {
            fullName = fullName.Trim();
            var spaceIndex = fullName.LastIndexOf(' ');
            return spaceIndex != -1 ? fullName.Substring(0, spaceIndex) : fullName;
        }

        /// <summary>
        /// Tạo ra doccode
        /// </summary>
        /// <param name="format"></param>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string MakeDocCode(string format, int number)
        {
            var now = DateTime.Now;
            var dic = new Dictionary<string, string>
                {
                    {"#yy#", now.ToString("yy")},
                    {"#yyyy#", now.ToString("yyyy")},
                    {"#mm#",now.ToString("MM")},
                    {"#dd#",now.ToString("dd")},
                    {"#n#",number.ToString()}
                };
            foreach (var item in dic)
            {
                format = Regex.Replace(format, item.Key, item.Value, RegexOptions.IgnoreCase);
            }
            return format;
        }

        /// <summary>
        /// Lấy ngày đầu tiên của tháng ứng với thời gian truyền vào
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime StartDayOfMonth(DateTime? date = null)
        {
            if (date == null) date = DateTime.Now;
            var landmark = (DateTime)date;
            return new DateTime(landmark.Year, landmark.Month, 1, 0, 0, 0, 0);
        }

        /// <summary>
        /// Lấy ngày đầu tiên của quý, ứng với thời gian truyền vào
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime StartDayOfQuarter(DateTime? date = null)
        {
            if (date == null) date = DateTime.Now;
            var landmark = (DateTime)date;
            int currQuarter = (landmark.Month - 1) / 3 + 1;
            return new DateTime(landmark.Year, 3 * currQuarter - 2, 1);
        }

        /// <summary>
        /// Láy ngày đầu tiên của năm, ứng với thời gian truyền vào
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime StartDayOfYear(DateTime? date = null)
        {
            if (date == null) date = DateTime.Now;
            var landmark = (DateTime)date;
            return new DateTime(landmark.Year, 1, 1, 0, 0, 0, 0);
        }
    }
}